<?php
declare (strict_types=1);

/**
 * facade相关方法使用说明
 */

namespace app\common\facade;


class Demo
{

    /** 创建异步任务v2.0.1版本支持 */
    public function client()
    {

        //使用方法：
        //1.依赖swoole扩展(非think-swoole)
        //2.合理配置config/server.php
        //2.cli执行 php think _tcpServer 启动服务端
        //3.创建客户端，投递任务

        //注意：
        //1.异步任务内，不支持cache缓存，支持redis缓存，如使用系统参数请实时获取或存redis，并且runtime/log文件夹需要有写入权限
        //2.异步任务内，所有路径只支持绝对路径，请勿使用相对路径！

        $class = '\app\common\model\Account'; //执行类
        $action = 'send'; //执行方法
        $arguments = ['id' => 1]; //参数

        //use addons\Task\facade\Task; 或者 完整命名空间直接调用
        //投递任务
        $result = \addons\Task\facade\Task::TCP()->task($class, $action, $arguments);

        dump($result);
    }

    /** 流水写入 **/
    public function account()
    {
        //首先 use addons\Target\facade\Target; 或者 完整命名空间直接调用
        //奖金流水
        \addons\Target\facade\Target::Account()
            ->basics('UID', '账户', '金额', '说明', '+或者-')
            ->lock(false)//写入流水是否上锁，默认false,开启后会大幅降低性能，开启后必须配合事务使用
            ->createBonus('来源', '奖金类型，对应总表的1,2,3,4...等');
        //普通流水
        \addons\Target\facade\Target::Account()
            ->basics('UID', '账户', '金额', '说明', '+或者-')
            ->lock(false)//写入流水是否上锁，默认false，开启后会大幅降低性能，开启后必须配合事务使用
            ->createNormal('来源');
    }

    /** API统一响应格式*/
    public function result()
    {
        //首先 use app\common\tool\Result; 或者 完整命名空间直接调用
        //成功
        \app\common\tool\Result::success('返回msg', '返回参数');
        //失败；
        \app\common\tool\Result::fail('返回msg');
    }

    /** 相关支付 */
    public function weChatPay()
    {
        //首先 use addons\Pay\facade\Pay; 或者 完整命名空间直接调用
        try {
            //微信H5支付
            $options = \addons\Pay\facade\Pay::setDriver('WeChat')
                ->setReturnUrl('同步跳转地址')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('MWEB');
            var_dump($options);

            //微信JSAPI支付
            $options = \addons\Pay\facade\Pay::setDriver('WeChat')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->setOpenId('微信openid')
                ->create('JSAPI');
            var_dump($options);

            //微信扫码支付
            $options = \addons\Pay\facade\Pay::setDriver('WeChat')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('NATIVE');
            var_dump($options);

            //微信APP支付
            $options = \addons\Pay\facade\Pay::setDriver('WeChat')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('APP');

            //商户号退款
            $options = \addons\Pay\facade\Pay::setDriver('WeChat')
                ->basicRefund('订单号','商户单号（订单号）','交易实付金额','退款金额')
                ->refund();
            //退款查询
            $options = \addons\Pay\facade\Pay::setDriver('WeChat')->queryRefund('商户单号（订单号）');

            var_dump($options);
        } catch (\Exception $e) {
            var_dump($e->getMessage());
        }

    }

    public function aliPay()
    {
        //首先 use addons\Pay\facade\Pay; 或者 完整命名空间直接调用
        try {
            //支付宝手机H5支付
            $options = \addons\Pay\facade\Pay::setDriver('AliPay')
                ->setReturnUrl('同步跳转地址')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('Wap');
            var_dump($options);

            //支付宝PC网站支付
            $options = \addons\Pay\facade\Pay::setDriver('AliPay')
                ->setReturnUrl('同步跳转地址')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('Web');
            var_dump($options);

            //支付宝扫码支付
            $options = \addons\Pay\facade\Pay::setDriver('AliPay')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('Scan');
            var_dump($options);

            //支付宝APP支付
            $options = \addons\Pay\facade\Pay::setDriver('AliPay')
                ->basic('购买商品', '订单号', '支付金额', '回调地址')
                ->create('App');
            var_dump($options);
        } catch (\Exception $e) {
            var_dump($e->getMessage());
        }
    }


    public function weChat()
    {
        //首先 use addons\WeChat\facade\WeChat; 或者 完整命名空间直接调用
        try {
            //scope传snsapi_base 静默授权用，传snsapi_userinfo，获取用户信息用,还有access_token
            $result = \addons\WeChat\facade\WeChat::getOauthRedirect('授权回跳地址', 'state参数', 'snsapi_base');
            var_dump($result);//通常直接，return redirect($options);跳转即可

            //获取openid，一般只做微信公众号JSAPI用到
            $result = \addons\WeChat\facade\WeChat::getOauthAccessToken('授权后获得的code');
            var_dump($result);

            //获取微信用户信息，公众号授权登录用到
            $result = \addons\WeChat\facade\WeChat::getUserInfo('access_token', 'openid');
            var_dump($result);
        } catch (\Exception $e) {
            var_dump($e->getMessage());
        }

    }

    public function weChatMini()
    {
        //首先 use addons\WeChatMini\facade\WeChatMini; 或者 完整命名空间直接调用
        try {
            //code为小程序传过来的，获取session_key以及openid
            $result = \addons\WeChatMini\facade\WeChatMini::session('code');
            var_dump($result);

            //三个参数都是小程序传过来的，获取用户信息
            $result = \addons\WeChatMini\facade\WeChatMini::getUserInfo('code', 'iv', 'encryptedData');
            var_dump($result);

            //code为小程序传过来的，，通过code授权码获取手机号
            $result = \addons\WeChatMini\facade\WeChatMini::getPhoneNumber('code');
            var_dump($result);

            //生成小程序码 userCode：用户唯一标识，page：二维码跳转的页面，savePath：小程序码保存的路径，trial：小程序码版本，默认体验版
            $result = \addons\WeChatMini\facade\WeChatMini::getMiniScene('userCode', 'page', 'savePath','trial');
            var_dump($result);

            //解析用户信息，可以解出来手机号 iv：前台传的，sessionKey：session方法获取，encryptedData：前台传的
            $result = \addons\WeChatMini\facade\WeChatMini::decode('iv', 'sessionKey', 'encryptedData');
            var_dump($result);
        } catch (\Exception $e) {
            var_dump($e->getMessage());
        }

    }

    public function qrCodeBackground()
    {
        //首先 use addons\Image\facade\Image; 或者 完整命名空间直接调用
        try {

            //二维码内容
            $url = 'http://new.tp6.com/index/login/index.html';
            //二维码图片名称,png格式
            $name = 'admin';
            //保存路径，/开头
            $savePath = '/qrcode';
            //主图
            $mainImg = '';
            //配图
            $otherImg = '';
            //x轴，配图在主图的x轴位置，
            $x = 100;
            //y轴，配图在主图的y轴位置，
            $y = 50;
            //可选，二维码大小，默认300，纠错级别为高
            $size = 300;
            //可选，二维码中间的logo
            $logo = '';
            //可选，是否重复生成,默认true,true状态下如果相同名字不会重复生成二维码
            $repeat = false;
            /**
             * 生成一个二维码
             */
            $path = \addons\Image\facade\Image::qrCode($url, $name, $savePath, $size, $logo, $repeat);
            var_dump($path);

            /**
             * 合并图片
             */
            $path = \addons\Image\facade\Image::merge($mainImg, $otherImg, $name, $savePath, $x, $y);
            var_dump($path);

            /**
             * 生成带背景的二维码
             */
            $path = \addons\Image\facade\Image::qrCodeBackground($url, $name, $savePath, $mainImg, $x, $y, $size);
            var_dump($path);
        } catch (\Exception $e) {
            var_dump($e->getMessage());
        }
    }
}

